﻿package org.abc.utils
{
	import flash.display.DisplayObject;

	/**
	 * 数组扩展类，增加乱序和去重功能
	 * @author Administrator
	 *
	 */
	public class ArrayBesideUtil extends Array
	{
		/**
		 * 打乱顺序
		 * @param value 数组对象
		 * @return Array
		 *
		 */
		public static function confusion(value:Array):Array
		{
			var len:Number=value.length
			for (var i:Number=0; i < len; i++)
			{
				var num:Number=Math.floor(Math.random() * len)
				var obj:Array=value.splice(num, 1)
				value.unshift(obj[0])
			}
			return value;
		}

		/**
		 * 去重重复元素
		 * @param value 数组对象
		 * @return Array
		 *
		 */
		public static function defoam(value:Array):Array
		{
			var obj:Object={};
			var arr:Array=value.concat();
			return arr.filter(function(item:*, index:int, array:Array):Boolean
			{
				return !obj[item] ? obj[item]=true : false
			});
		}

		/**
		 * 从数组arr中删除obj
		 * @author	Mr.zheng
		 * @param obj
		 * @param arr
		 * @return
		 *
		 */
		public static function removeObjFromArr(obj:*, arr:Array):Boolean
		{
			return arr.some(function(item:*, index:int, array:Array):Boolean
			{
				if (item == obj)
				{
					arr.splice(index, 1);
					return true;
				}
				return false;
			});
		}

		/**
		 * 数组中是否有对象obj
		 * @author	Mr.zheng
		 * @param	obj
		 * @param	arr
		 * @return
		 */
		public static function hasItem(obj:*, arr:Array):Boolean
		{
			return arr.some(function(item:*, index:int, array:Array):Boolean
			{
				if (item == obj)
				{
					return true;
				}
				return false;
			});
		}

		/**
		 * 获取整型数组排序后在原数组的位置，非常有用的一个应用
		 * @param arr
		 * @return
		 */
		public static function orderArrayTag(arr:Array):Array
		{
			return arr.sort(Array.NUMERIC | Array.RETURNINDEXEDARRAY);
		}

		/**
		 * 排序,从小到大
		 * @param arr
		 * @return
		 *
		 */
		public static function orderX(arr:Array):Array
		{
			function sortOnX(a:*, b:*):Number
			{
				var aPrice:Number=a.x;
				var bPrice:Number=b.x;

				if (aPrice > bPrice)
				{
					return 1;
				}
				else if (aPrice < bPrice)
				{
					return -1;
				}
				else
				{
					//aPrice == bPrice
					return 0;
				}
			}
			return arr.sort(sortOnX);
		}

		/**
		 * 排序
		 * @param arr
		 * @return
		 *
		 */
		public static function orderY(arr:Array):Array
		{
			function sortOnY(a:*, b:*):Number
			{
				var aPrice:Number=a.y;
				var bPrice:Number=b.y;

				if (aPrice > bPrice)
				{
					return 1;
				}
				else if (aPrice < bPrice)
				{
					return -1;
				}
				else
				{
					//aPrice == bPrice
					return 0;
				}
			}
			return arr.sort(sortOnY)
		}

		/**
		 * 按深度排序
		 * @param a
		 * @param b
		 * @return
		 *
		 */
		public static function orderDepth(arr:Array):Array
		{
			function sortOnY(a:DisplayObject, b:DisplayObject):Number
			{
				var aPrice:Number=a.parent.getChildIndex(a);
				var bPrice:Number=b.parent.getChildIndex(b);

				if (aPrice > bPrice)
				{
					return 1;
				}
				else if (aPrice < bPrice)
				{
					return -1;
				}
				else
				{
					//aPrice == bPrice
					return 0;
				}
			}
			return arr.sort(sortOnY)
		}

	}
}
